import axios, { type Method } from 'axios'
import { useUserStore } from '@/stores'
// 函数调用方式引入vant组件库
import { showToast } from 'vant'
import router from '@/router'
// 引入定义好的数据类型
// import type { User } from '@/types/user'
// 请求相关

/* 1.创建axios实例
    1.1配置请求根路径
    1.2配置超时时间
   
    2.设置请求拦截器
     2.1统一处理相同业务 - 如携带token

    3.设置响应拦截器
     3.1 数据剥离
     3.2 响应状态码正确200，业务状态码错误- 业务处理失败（请求成功，业务失败）
     3.3统一处理错误信息，


*/
const baseURL = 'https://consult-api.itheima.net'
const instance = axios.create({
  baseURL,
  timeout: 10000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    const store = useUserStore()
    if (store.user?.token) {
      // 注意空格
      config.headers.Authorization = `Bearer ${store.user.token}`
    }
    // 在发送请求之前做些什么
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    if (response.data.code !== 10000) {
      showToast(response.data.message || '业务处理失败')
      // 终端代码执行
      return Promise.reject(response.data)
    }
    return response.data
  },
  function (error) {
    // 对响应错误做点什么
    console.log(error)

    if (error.response.status === 401) {
      // 1.清除登录状态
      const store = useUserStore()
      store.delUser()
      // 跳转到登录页面
      router.push('/login')
    }
    return Promise.reject(error)
  }
)
// 封装一个request函数
// 有提示
// 统一进行传参处理
// 三个参数url method submitData可选参数  TODO

type Data<T> = {
  code: number
  message: string
  data: T
}

/* const request = <User>(
  url: string,
  method: Method = 'get',
  submitData?: object
) => {
  return instance.request<User, Data<User>>({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
type Account = {
  height: number
}
request<User>('/user/patient', 'get').then((res) => {
  res.data.id
})
request<Account>('/user/List').then((res) => {
  res.data.height
})  */

const request = <T>(
  url: string,
  method: Method = 'get',
  submitData?: object
) => {
  // axios内部提供的能力
  return instance.request<T, Data<T>>({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}

export { baseURL, instance, request }
